题目描述
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
示例 1:
1 | 输入: |
提示:
- $0 < grid.length <= 200$
- $0 < grid[0].length <= 200$
算法
(动态规划) $O(n^2)$
状态表示:$f[i][j]$,表示走到第 $(i, j)$ 这个格子时能拿到礼物的最大价值
状态计算:
每次只能向右或向下走,所以只能从左边或上边到达 $(i, j)$
- 左边,
f[i][j] = f[i][j - 1]
- 右边,
f[i][j] = f[i - 1][j]
两者取 $max$
边界:f[n][m]
就是答案
时间复杂度
状态数量 $n^2$ 个,状态转移所需时间是 $O(1)$,所以总时间复杂度为 $O(n^2)$
空间复杂度
$O(n^2)$
C++ 代码
1 | class Solution { |